package com.xiyue.leaspring.util.validate;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.MessageSource;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.support.DefaultMultipartHttpServletRequest;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * 实现Action上传文件验证的处理规则
 */
public class ActionMIMEValidationUtil {

    private Logger logger = LoggerFactory.getLogger(ActionValidationUtil.class);//日志组件
    private Map<String,String> errors = new HashMap<>();//保存错误信息
    private String rule;//保存验证规则
    private MultipartHttpServletRequest request;//请求对象
    private MessageSource messageSource;//读取资源文件

    /**
     * 实例化Action数据验证工具类,在此类中可以直接实现数据验证以及错误信息保存
     * @param rule  要执行的数据验证规则
     * @param request 通过该参数可以取得用户的请求参数
     * @param messageSource 所有的消息资源的文字提示信息
     */
    public ActionMIMEValidationUtil(String rule,HttpServletRequest request,
                                MessageSource messageSource){
        this.rule = rule;//保存规则
        this.messageSource = messageSource;//保存messageSource对象
        if(request instanceof DefaultMultipartHttpServletRequest){
            this.request = (DefaultMultipartHttpServletRequest)request;//保存request对象包含所有的上传信息
            this.handleValidator();//构造方法进行验证操作
        }
    }

    /**
     * 实现验证的具体操作,根据指定的验证规则来获取验证数据以实现各个数据的检测处理
     */
    private void handleValidator() {
        String ruleResult[] = this.rule.split("\\|");//验证规则拆分
        for (int x=0;x<ruleResult.length;x++){//获取全部参数
            try {
                Map<String, MultipartFile> fileMap = this.request.getFileMap();//接收文件
                if(fileMap.size()>0){//确有上传内容
                    Iterator<Map.Entry<String,MultipartFile>> iter = fileMap.entrySet().iterator();
                    while (iter.hasNext()){//迭代上传文件
                        Map.Entry<String,MultipartFile> me = iter.next();
                        if(me.getValue().getSize()>0){//有文件上传
                            if(!this.validateMime(me.getValue()
                                    .getContentType(),this.rule)){//不符合逻辑
                                this.errors.put(me.getKey(),this.messageSource
                                        .getMessage("validation.mime.msg",null,null));
                            }
                        }
                    }
                }
            }catch (Exception e){
                this.logger.error(e.toString());
            }
        }
    }

    /**
     * 如果当前传递MIME类型符合定义范围，则表示允许上传
     * @param contentType 当前传递文件的规则
     * @param rule 所有满足的验证规则
     * @return 如果验证通过返回true,否则返回false
     */
    private boolean validateMime(String contentType, String rule) {
        if (contentType == null || "".equals(rule)){//上传文件是否有MIME类型
            return false;//验证失败
        }
        String rules[] = rule.split("\\|");//拆分规则
        for (int x=0;x<rules.length;x++){//检测规则
            if(contentType.equals(rules[x])){
                return true;//验证通过
            }
        }
        return false;//验证失败
    }

    /**
     * 获取全部的错误信息，如果没有错误则集合的长度为0
     * @return 错误内容
     */
    public Map<String,String> getErrors(){//返回错误信息
        return errors;
    }
}
